package demo.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2020/7/8-2020
 * @Description: 这里用一句话描述这个类的作用
 */
public class ConstructorCollector {
    public static void main(String[] args) {
        //获取Class对象
        Class clazz=null;
        try {
            clazz=Class.forName("demo.reflect.ReflectTarget");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //1:批量方法
        //获取所有的公有的构造方法
        Constructor[] constructors = clazz.getConstructors();
        //获取所有的构造方法(包括 私有、受保护、默认、公有)
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        //2:获取单个的构造方法，并调用(公有的构造函数)
        try {
            Constructor constructor = clazz.getConstructor(char.class);
            constructor.newInstance('A');
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //3:获取单个的构造方法，并调用(包括 私有、受保护、默认、公有)
        try {
            //private ReflectTarget(int index){} 通过反射获取到了私有的构造方法
            Constructor declaredConstructor = clazz.getDeclaredConstructor(int.class);
            //即使通过反射可以获取到私有的构造方法。但是不能直接使用。因为被 private 修饰。
            //需要使用setAccessible(true) 设置成可访问的。
            //setAccessible(true) :暴力访问，忽略掉访问修饰符
            declaredConstructor.setAccessible(true);
            try {
                //调用Constructor的newInstance方法进行对象的创建。
                declaredConstructor.newInstance(1);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}
